package com.catazy.konsist.test

import org.junit.jupiter.api.Test
import java.util.Stack


/**
 * - 作者: Tao
 * - 日期: 2025/1/10
 * - 时间: 09:58
 * - 描述: 算法测试
 */
class HelloTest {

    @Test
    fun test() {
//        val fibCount = fib(8)
//        println("递归结果为 = $fibCount")
        forLoopRecur(20)
    }

    /**
     * 计算斐波那契数列中的第n个数字
     *
     * 斐波那契数列是一个每个数字是前两个数字之和的序列，以0和1开始
     * 例如，序列的前几个数字是0, 1, 1, 2, 3, 5, 8, ...
     *
     * @param n 斐波那契数列中的位置（从0开始）
     * @return 第n个斐波那契数
     *
     * 注意：此函数使用递归实现，对于大数值的n，可能会导致性能问题或栈溢出错误
     *
     * 举例:
     *
     *      n=5
     *      1. fib(5) = fib(4) + fib(3)
     *      2.1 fib(4) = fib(3) + fib(2)  2.2 fib(3) = fib(2) + fib(1)
     *      3.1.1 fib(3) = fib(2) + fib(1) == 1  3.1.2 fib(2) = 1  3.2  == 1
     */
    private fun fib(n: Int): Int {
        // 如果n小于或等于1，则直接返回n
        return if (n == 1 || n == 2) {
            n - 1
        } else {
            // 否则，递归调用fib函数计算第n-1个和第n-2个斐波那契数，并返回它们的和
            fib(n - 1) + fib(n - 2)
        }
    }

    /**
     * 使用迭代模拟递归求和
     */
    private fun forLoopRecur(n: Int): Int {
        val stack = Stack<Int>()
        for (i in n downTo 0){
            stack.push(i)
        }
        var res = 0
        while (stack.isNotEmpty()){
            val pop = stack.pop()
            println("当前pop值为: $pop")
            res += pop
            println("求和结果为: $res")
        }
        return res
    }

}